Airflowのコンセプトと仕組みを理解する
春田です。
Airflowを活用したプロジェクトに携わる事になったのですが今回初めて触れる形となるため、まずはAirflowに関する概要を勉強しながらまとめてみました。
Airflowとは
The Airflow Platform is a tool for describing, executing, and monitoring workflows.
Airflowは、ワークフロー(例えば、A B Cという3つのタスクがあった時、これらをいつどの順番で実行するか)を記述、実行、監視するためのツールです。
このAirflowは DAG (Directed Acyclic Graph: 有向非巡回グラフ) というグラフ理論がベースになっています。私自身、グラフ理論にあまり精通していないのため、自分でも理解できるように噛み砕いた言葉で説明していきます。
DAG (Directed Acyclic Graph)
DAG とは何かの前に、まずはグラフ理論について説明します。一口にグラフと言っても色んな種類がありますが、ここで定義されるグラフは、「モノ」と「モノの関係性」で構成されます。身近な例で言えば、電車の路線図ですね。この場合、グラフ理論では「駅」のことを ノード (node) 、「路線」のことをエッジ (edge) と呼びます。DAGはグラフ理論の一種で、エッジのベクトルは一方向のみで、さらに一度通ったノードには戻ってこれないという非巡回性の特徴を持っています。
このような特徴を持ったDAGは、個々のノードに関係性があるワークフローに当てはめることができます。例えば、流れてくるデータはまず「格納」して「整形」しないと、「分析」ができませんよね? このように個々のタスクに依存関係がある時、DAGの理論が使えます。
というよりも、そもそもDAG自体がジョブ・スケジューリングのために研究されてきたみたいです。
ワークフローの表現
タスク同士の関係性を記述するために、AirflowではPythonスクリプトを使います。タスクの関係性は トポロジカルソート によって整理され、ワークフローとして表現されるようになります。この辺、タスク同士の関係性をわかりやすく、楽に記述するためのテンプレート (Operatorクラスなど) がAirflowには詰まっているみたいですね。
トポロジカルソートには何種類かありますが、一番基本的なものに Kahn's Algorithm というアルゴリズムがあります。
- Kahn's Algorithm
- まず全ノードのうち、入力辺(自身にベクトルが向いているエッジ)のないノードを探し出して始点する。
- この始点ノードを消去。
- 次に入力辺のないノードを探す。
- そのノードを消去。
- 3 4 を繰り返す
- 消去できたものから順番を決定していく。
何となくイメージはつきますでしょうか? ざっくり言えば、タスクの中身は考慮せず、タスクの繋がりだけで一番効率の良いフローを計算する方法です。解は必ず1通り、ということはなく、何種類かパターンができることが多いです。
まとめ
公式サイトで、Airflowにおける重要用語が以下のようにまとめられています。
- DAG: a description of the order in which work should take place
- Operator: a class that acts as a template for carrying out some work
- Task: a parameterized instance of an operator
- Task Instance: a task that 1) has been assigned to a DAG and 2) has a state associated with a specific run of the DAG
- DAG: どのプログラムがどの順序で実行されるかの記述
- Operator: プログラムを実行するためのテンプレート
- Task: Operatorの引数となったインスタンス
- Task Instance:
- 1) DAGに当てはめられたタスク
- 2) そのDAG上で他のタスクと繋がりのあるタスク
Pythonファイル記述後、最終的にワークフローはGUIベースで可視化・管理もできます。
何のためにAirflowを使うか、最初はあまりイメージが湧かなかったのですが、大枠の概要は掴めました。プログラムが複合的になるほど、それらの依存関係を整理するために、Airflowようなフレームワークが生きてくるのですね。
ジョブ管理ツールは開発規模が小さいとあまり使う機会がないため、個人の開発が多かった私には結構とっつきづらい内容でした。ちゃんと使えれば、汎用性が高くてなかなか便利そうです。